/* 工具公式 */

/**
 * 防抖动 节流器
 * @param func
 * @param delay
 * @returns {function(...[*]=)}
 */
export function debounce (func, delay = 300) { // 防抖动
  let timer
  return function (...args) {
    if (timer) {
      clearTimeout(timer)
    }
    timer = setTimeout(() => {
      func.apply(this, args)
    }, delay)
  }
}

/**
 * 数组插入
 * @param arr {array} 原数组
 * @param val 插入值
 * @param compare findIndex索引方法
 * @param maxLen {number} 最大长度
 */
export function insertArray (arr, val, compare, maxLen) {
  const index = arr.findIndex(compare)
  if (index === 0) {
    return
  }
  if (index > 0) {
    arr.splice(index, 1)
  }
  arr.unshift(val)
  if (maxLen && arr.length > maxLen) {
    arr.pop()
  }
}

/**
 * 删除数组的一项 修改原数组
 * @param arr 原数组
 * @param compare findIndex 检索方法
 */
export function deleteFromArray (arr, compare) {
  const index = arr.findIndex(compare)
  if (index > -1) {
    arr.splice(index, 1)
  }
}

/**
 * 洗牌 （打乱数组顺序）
 * @param array
 * @return {[]}
 */
export function shuffle (array) {
  let length = array == null ? 0 : array.length

  if (!length) return []

  let index = -1
  const lastIndex = length - 1
  const result = array.slice()
  while (++index < length) {
    const rand = index + Math.floor(Math.random() * (lastIndex - index + 1))
    const value = result[rand]
    result[rand] = result[index]
    result[index] = value
  }

  return result
}

/**
 * 时间格式化
 * // 参考：https://www.jb51.net/article/76548.htm
 * @param fmt string {格式} 例如"yyyy-MM-dd hh:mm:ss"
 * @param date
 * @return {string}
 */
export function formatDate (fmt = 'yyyy-MM-dd', date = new Date()) {
  let o = {
    'y+': date.getFullYear(), //  年份
    'M+': date.getMonth() + 1, //  月份
    'd+': date.getDate(), //  日
    'h+': date.getHours(), //  小时
    'm+': date.getMinutes(), //  分钟
    's+': date.getSeconds(), //  秒
    'q+': Math.floor((date.getMonth() + 3) / 3),
    'ms': date.getMilliseconds()
  }
  if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
  for (let k in o) { if (new RegExp('(' + k + ')').test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length))) }
  return fmt
}

/**
 * 数量转换文字单位 万 | 亿
 * @return {number}
 */
export function FormatCount (value = 0) {
  if (!parseInt(value)) return 0
  if (value < 10000) {
    return value
  } else if (value < 100000000) {
    return parseInt(value / 10000) + '万'
  } else {
    return parseInt(value / 100000000) + '亿'
  }
}

/**
 * 格式化时间 (分钟:秒钟)
 * @return {string} 秒
 */
export function FormatInterval (interval) {
  interval = interval | 0
  const minute = interval / 60 | 0
  const second = _pad(interval % 60)
  return `${minute}:${second}`
}
function _pad (num, n = 2) {
  let len = num.toString().length
  while (len < n) {
    num = '0' + num
    len++
  }
  return num
}

/**
 * 设置Cookie
 * @param name  {string}  名称
 * @param value {string}  值
 * @param expires {number}  过期天数  单位:天
 */
export function setCookie (name, value, expires = 0) {
  let d = new Date()
  d.setTime(d.getTime() + (expires * 24 * 60 * 60 * 1000))
  let time = 'expires=' + d.toUTCString()
  document.cookie = name + '=' + value + '; ' + time
}

/**
 * 清除cookie
 * @param name  {string}  名称
 */
export function clearCookie (name) {
  setCookie(name, '', -1)
}
